PART 06의 마무리는 DeepFace의 find로 얼굴 검색 엔진을 만드는 실습입니다. 사진 한 장을 던지면 데이터베이스에서 같은 인물의 사진들을 찾아 주는, 사진 앱의 "이 사람으로 검색" 기능의 핵심입니다. PART 05에서 직접 짠 1:N 식별을 DeepFace는 함수 한 줄로 끝냅니다.
find가 대신 해 주는 것
PART 05에서는 DB를 만들고, 거리를 재고, argmin으로 가장 가까운 사람을 찾는 과정을 직접 짰습니다. DeepFace의 find는 그 전부를 안에서 처리합니다. 폴더(DB)와 질의 이미지만 주면, 폴더 안 모든 얼굴의 임베딩을 구해 캐시해 두고, 질의와 가까운 순으로 정렬해 돌려줍니다.
known/*.jpg] --> C C --> D[가까운 순 결과표
경로·거리]
검색 엔진 코드
인물 사진이 담긴 폴더를 DB로 삼아 검색합니다.
# 파일: search.py"""DeepFace.find로 DB에서 같은 인물을 검색한다."""from deepface import DeepFace# 질의 이미지와 DB 폴더. 모델·검출기는 정확도 위주로 고른다results = DeepFace.find( img_path="query.jpg", db_path="known/", model_name="Facenet512", detector_backend="yunet",)# results: 질의 속 얼굴마다 결과표(DataFrame) 하나df = results[0]print(f"후보 {len(df)}건")for _, row in df.head(5).iterrows(): print(f" {row['identity']} 거리 {row['distance']:.4f}")
find는 질의 사진 속 얼굴마다 결과표를 하나씩 돌려줍니다. 표에는 매칭된 사진 경로(identity)와 거리(distance)가 가까운 순으로 정렬되어 있습니다. 첫 줄이 가장 닮은 후보입니다. 거리가 모델 임계값 안에 드는 후보만 표에 포함되므로, 표가 비어 있으면 "DB에 같은 사람이 없다"는 뜻입니다.
캐시가 만드는 속도
find를 처음 실행하면 DB 폴더 안에 .pkl 캐시 파일이 생깁니다. 폴더 내 모든 얼굴의 임베딩을 미리 계산해 저장해 둔 것입니다. 두 번째 검색부터는 이 캐시를 읽어 질의 한 장만 새로 임베딩하면 되므로 훨씬 빠릅니다.
주의할 점은 DB 폴더에 사진을 추가·삭제하면 캐시를 갱신해야 한다는 것입니다. DeepFace는 폴더 변화를 감지해 캐시를 다시 만들지만, 이상하게 동작하면 .pkl 파일을 지우고 다시 실행하면 깨끗하게 재생성됩니다.
인식과 분석을 함께
검색에 더해, 찾은 사람의 표정·나이까지 한 번에 보여 주면 더 풍부한 엔진이 됩니다. PART 06의 두 기능을 결합하는 것입니다.
# 파일: search_plus.py (검색 + 분석)from deepface import DeepFaceresults = DeepFace.find("query.jpg", "known/", model_name="Facenet512", detector_backend="yunet")best = results[0].iloc[0]["identity"] if len(results[0]) else Noneif best: print("가장 닮은 사람:", best) info = DeepFace.analyze("query.jpg", actions=["age", "emotion"], detector_backend="yunet")[0] print(f" 추정 나이 {info['age']}, 표정 {info['dominant_emotion']}")else: print("DB에서 일치하는 사람을 찾지 못함")
find로 신원을 찾고 analyze로 속성을 더하면, "이 사람은 홍길동이고, 지금 웃고 있으며, 30대로 보인다" 같은 종합 정보를 한 화면에 만들 수 있습니다. PART 10의 종합 프로젝트에서 이런 결합을 본격적으로 활용합니다.
실무 팁.
find의 DB가 커질수록 첫 캐시 생성이 오래 걸리고, 매 검색의 비교도 늘어납니다. 수천 명까지는 이 방식으로 충분하지만, 수만 명을 넘어가면 모든 임베딩을 일일이 비교하는 방식이 느려집니다. 그때는 가까운 벡터를 빠르게 찾아 주는 전용 검색 색인이 필요한데, 이 대규모 검색은 PART 07(InsightFace)에서 다룹니다.
이 장에서 기억할 것
DeepFace의 find는 PART 05에서 직접 짠 1:N 식별을 함수 한 줄로 대신하며, DB 폴더의 임베딩을 .pkl로 캐시해 두 번째 검색부터 빠르게 동작합니다. 결과표는 거리 가까운 순으로 후보를 주고, analyze와 결합하면 신원에 표정·나이를 더할 수 있습니다. 다만 수만 명 규모에서는 전용 색인이 필요합니다. 이로써 PART 06이 끝납니다. 다음 PART 07에서는 프로덕션급 정확도와 대규모 검색을 책임지는 InsightFace로 들어갑니다.